package discovery

import (
	"encoding/json"
	"fmt"
	"github.com/pkg/errors"
	"strings"
)

type Server struct {
	Name   string `json:"name"`   // 服务名称 例：user
	Addr   string `json:"addr"`   // 服务地址
	Weight int    `json:"weight"` // 服务权重 后续用来实现降级熔断
}

// BuildPrefix 返回服务 Key 前缀
func BuildPrefix(server *Server) string {
	return fmt.Sprintf("/%s/", server.Name)
}

// BuildRegisterPath 返回服务注册地址
func BuildRegisterPath(server *Server) string {
	return fmt.Sprintf("%s%s", BuildPrefix(server), server.Addr)
}

// ParseValue 反序列化 Server
func ParseValue(value []byte) (*Server, error) {
	server := Server{}
	if err := json.Unmarshal(value, &server); err != nil {
		return nil, err
	}

	return &server, nil
}

// SplitPath 分割路径，后续用作 Server 地址的更新
func SplitPath(path string) (*Server, error) {
	server := Server{}
	strs := strings.Split(path, "/")
	if len(strs) == 0 {
		return &server, errors.New("invalid path")
	}

	server.Addr = strs[len(strs)-1]

	return &server, nil
}
